﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using DA_OOMModel;
using DA_OOMModelIDAL;
using DA_OOMDALFactory;
using NHibernate;
using DA_OOMNHibernateDAL;
using System.Collections;
using System.Data;


namespace DaCredito
{

    public class ControladorDaCredito : Controlador
    {

        private static ControladorDaCredito ioInstancia;

        public static ControladorDaCredito GetInstance()
       {
           if (ioInstancia == null)
           {
               ioInstancia = new ControladorDaCredito();
           }
           return ioInstancia;
       }
        /*
        public  Cliente CadastrarCliente(string asRazaoSocial, string asNomeFantasia, string asNumeroCNPJ, string asEmail,
                                  string asEnderecoLogradouro, string asEnderecoComplemento, string asEnderecoNumero,
                                   string asEnderecoInscricaoEstadual, string asEnderecoInscricaoMunicipal,
                                    string asEnderecoNumeroCep, string asEnderecoNomeBairro,
                                    Cidade aoEnderecoCidade, 
                                    string asNickname, string asSenha,
                                    string asNome, string asSobrenome)
        {

            
            // ---------------------------------
            // Cadastro do Cliente
            // ---------------------------------
            Cliente loCliente = new Cliente();
            
            loCliente.ClientePK = new ClientePK(1);
            loCliente.CliNmRazaoSocial = asRazaoSocial; 
            loCliente.CliNmFantasia = asNomeFantasia;
            loCliente.CliNuCnpj = asNumeroCNPJ;
            loCliente.CliDtCadastro = DateTime.Today;
            
            IClienteDAL loClienteDAO = ConcreteDALFactory.CreateClienteDAL();

           
            // ---------------------------------
            // Cadastro do Endereço do cliente
            // ---------------------------------
            Endereco loEndereco = new Endereco();

            loEndereco.EnderecoPK = new EnderecoPK(2);
            loEndereco.EndNmLogradouro = asEnderecoLogradouro;
            loEndereco.EndNuCep = asEnderecoNumeroCep;
            loEndereco.EndNmBairro = asEnderecoNomeBairro;
            loEndereco.EndNuImovel = asEnderecoNumero;
            loEndereco.EndDsComplemento = asEnderecoComplemento;
            loEndereco.Cliente = loCliente;
            loEndereco.Cidade = aoEnderecoCidade;

            IEnderecoDAL loEnderecoDAO = ConcreteDALFactory.CreateEnderecoDAL();

            // ---------------------------------
            // Cadastro do Usuário do cliente
            // ---------------------------------
           // loCliente.Usuario.Add(CadastrarUsuario(loCliente, asNickname, asSenha, asNome, asSobrenome, asEmail, TipoUsuario.AdministradorCliente));
            

           // loCliente.Endereco.Add(loEndereco);

            loClienteDAO.Insert(loCliente);
            loEnderecoDAO.Insert(loEndereco);

          

            return loCliente;

        }*/
        public  Cliente CadastrarCliente(Pessoa aoPessoa, PessoaJuridica aoPessoaJuridica, Cliente aoCliente, Usuario aoUsuario, Endereco aoEndereco, Telefone aoTelefone)
        {

            if (aoPessoa.PesDtCadastro == null)
            {
                aoPessoa.PesDtCadastro = DateTime.Today;
            }

            ISession loSession = HibernateSessionManager.Instance.GetSession();
            try
            {
                

                loSession.BeginTransaction();
                loSession.SaveOrUpdate(aoPessoa);
                loSession.SaveOrUpdate(aoPessoaJuridica); 
                loSession.SaveOrUpdate(aoCliente);
                loSession.SaveOrUpdate(aoUsuario);
                loSession.SaveOrUpdate(aoEndereco);
                loSession.SaveOrUpdate(aoTelefone);
                loSession.Transaction.Commit();
            }
            catch (Exception loException)
            {
                loSession.Close();
                throw;
            }
           
            return aoCliente;

        }
        public Sacado CadastrarSacado(Pessoa aoPessoa, PessoaJuridica aoPessoaJuridica, Sacado aoSacado, Endereco aoEndereco, Telefone aoTelefone)
        {

            if (aoPessoa.PesDtCadastro == null)
            {
                aoPessoa.PesDtCadastro = DateTime.Today;
            }

            ISession loSession = HibernateSessionManager.Instance.GetSession();
            try
            {


                loSession.BeginTransaction();
                loSession.SaveOrUpdate(aoPessoa);
                loSession.SaveOrUpdate(aoPessoaJuridica);
                loSession.SaveOrUpdate(aoSacado);
                loSession.SaveOrUpdate(aoEndereco);
                loSession.SaveOrUpdate(aoTelefone);
                loSession.Transaction.Commit();
            }
            catch (Exception loException)
            {
                loSession.Close();
                throw;
            }

            return aoSacado;

        }
        public ContaBancaria CadastrarContaBancariaEmpresa(ContaBancaria aoContaBancaria, Agencia aoAgencia, Convenio aoConvenio, Banco aoBanco)
        {

            ISession loSession = HibernateSessionManager.Instance.GetSession();
            try
            {


                loSession.BeginTransaction();
                loSession.SaveOrUpdate(aoBanco);
                loSession.SaveOrUpdate(aoAgencia);
                loSession.SaveOrUpdate(aoContaBancaria);
                loSession.SaveOrUpdate(aoConvenio);
                loSession.Transaction.Commit();
            }
            catch (Exception loException)
            {
                loSession.Close();
                throw;
            }

            return aoContaBancaria;

        }
        public TituloFinanceiro CadastrarTituloFinanceiro(TituloFinanceiro aoTitulo)
        {
            decimal ldcNuNossoNumero;

            Convenio loConvenio = this.RecuperaConvenioEmpresa();

            if (loConvenio == null)
                throw new Exception("Os dados do convênio bancário não foram definidos pelo administrador do sistema.");

            aoTitulo.Convenio = loConvenio;
            aoTitulo.TtfNuNossoNumero = loConvenio.CvnNuProximoNossoNumero;

            ldcNuNossoNumero = Decimal.Parse(loConvenio.CvnNuProximoNossoNumero);
            ldcNuNossoNumero += 1;

            loConvenio.CvnNuProximoNossoNumero = ldcNuNossoNumero.ToString();

            ISession loSession = HibernateSessionManager.Instance.GetSession();
            try
            {

                loSession.BeginTransaction();
                loSession.SaveOrUpdate(aoTitulo);
                loSession.SaveOrUpdate(loConvenio);
                loSession.Transaction.Commit();
            }
            catch (Exception loException)
            {
                loSession.Close();
                throw;
            }

            return aoTitulo;

        }
        public List<Cliente> RecuperaListaCliente()
        {

            IClienteDAL loClienteDAO = ConcreteDALFactory.CreateClienteDAL();

            return loClienteDAO.GetClienteList();

        }
        public List<Sacado> RecuperaListaSacado()
        {

            ISacadoDAL loSacadoDAO = ConcreteDALFactory.CreateSacadoDAL();

            return loSacadoDAO.GetSacadoList();

        }
        public  List<Estado>  RecuperaListaEstado()
        {

            IEstadoDAL loEstadoDAO = ConcreteDALFactory.CreateEstadoDAL();

            return loEstadoDAO.GetEstadoList();

        }
        public  List<Cidade> RecuperaListaCidade()
        {

            ICidadeDAL loCidadeDAO = ConcreteDALFactory.CreateCidadeDAL();

            List <Cidade> loListaCidade = loCidadeDAO.GetCidadeList();

            loListaCidade.Sort(delegate(Cidade c1, Cidade c2) { return c1.CidNmCidade.CompareTo(c2.CidNmCidade); });

            return loListaCidade;


        }
        public  List<Cidade> RecuperaListaCidade(EstadoPK aoEstadoPK)
        {
            
            ICidadeDAL loCidadeDAO = ConcreteDALFactory.CreateCidadeDAL();

            Estado loEstado = new Estado();
            loEstado.EstadoPK = aoEstadoPK;

            List<Cidade> loListaCidade = loCidadeDAO.FindByEstado(loEstado);

            loListaCidade.Sort(delegate(Cidade c1, Cidade c2) { return c1.CidNmCidade.CompareTo(c2.CidNmCidade); });

            return loListaCidade;

            /*
           IEnderecoDAL loEnderecoDAO = ConcreteDALFactory.CreateEnderecoDAL();

           Cliente loCliente = new Cliente();
           loCliente.ClientePK = new ClientePK(1);
            loEnderecoDAO.FindByCliente(loCliente);

            return null;*/

        }
        public  List<Usuario> RecuperaListaUsuario()
        {

            IUsuarioDAL loUsuarioDAO = ConcreteDALFactory.CreateUsuarioDAL();

            return loUsuarioDAO.GetUsuarioList();

        }
        public ContaBancaria RecuperaContaBancariaEmpresa()
        {

            IContaBancariaDAL loContaBancariaDAO = ConcreteDALFactory.CreateContaBancariaDAL();

            List<ContaBancaria> loListaContaBancaria = loContaBancariaDAO.GetContaBancariaList();

            if (loListaContaBancaria.Count > 0)
            {
                return loListaContaBancaria[0];
            }

            return null;
        }
        public ContaBancaria RecuperaContaBancariaCliente(ClientePK aoCLientePK)
        {

            IContaBancariaDAL loContaBancariaDAO = ConcreteDALFactory.CreateContaBancariaDAL();
            Cliente loCliente = new Cliente();
            loCliente.ClientePK = aoCLientePK;

            List<ContaBancaria> loListaContaBancaria = loContaBancariaDAO.FindByCliente(loCliente);

            if (loListaContaBancaria.Count > 0)
            {
                return loListaContaBancaria[0];
            }

            return null;
        }
        public Convenio RecuperaConvenioEmpresa()
        {

            IConvenioDAL loConvenioDAO = ConcreteDALFactory.CreateConvenioDAL();

            List<Convenio> loListaConvenio = loConvenioDAO.GetConvenioList();

            if (loListaConvenio.Count > 0)
            {
                return loListaConvenio[0];
            }

            return null;
        }
        public List<Usuario> RecuperaListaUsuario(Cliente aoCliente)
        {

            IUsuarioDAL loUsuarioDAO = ConcreteDALFactory.CreateUsuarioDAL();

            return loUsuarioDAO.FindByCliente(aoCliente);

        }
      
        public List<Endereco> RecuperaListaEndereco(Pessoa aoPessoa)
        {

            IEnderecoDAL loEnderecoDAO = ConcreteDALFactory.CreateEnderecoDAL();

            return loEnderecoDAO.FindByPessoa(aoPessoa);

        }

        public List<Telefone> RecuperaListaTelefone(Pessoa aoPessoa)
        {

            ITelefoneDAL loTelefoneDAO = ConcreteDALFactory.CreateTelefoneDAL();

            return loTelefoneDAO.FindByPessoa(aoPessoa);

        }
        public  Usuario CadastrarUsuario(Usuario aoUsuario)
        {

            ISession loSession = HibernateSessionManager.Instance.GetSession();
            try
            {

                loSession.BeginTransaction();
                loSession.SaveOrUpdate(aoUsuario);
                loSession.Transaction.Commit();
            }
            catch (Exception loException)
            {
                loSession.Close();
                throw;
            }

            return aoUsuario;


        }

        public MovimentacaoFinanceira EfetuarRepasse(List<LancamentoFinanceiroPK> aoListaLancamentoFinanceiro)
        {

            MovimentacaoFinanceira loMovimentacaoFinanceira = new MovimentacaoFinanceira();
            ContaBancaria loContaBancariaEmpresa = this.RecuperaContaBancariaEmpresa();

            ISession loSession = HibernateSessionManager.Instance.GetSession();
            try
            {
                
                loMovimentacaoFinanceira.MovDtMovimentacao = DateTime.Today;
                loMovimentacaoFinanceira.MovTpMovimentacao = "T";

                RepasseAoCliente loRepasseAoCliente = new RepasseAoCliente();
                loRepasseAoCliente.MovimentacaoFinanceira = loMovimentacaoFinanceira;

                //loSession.BeginTransaction();
                loSession.Save(loMovimentacaoFinanceira);
                loSession.Save(loRepasseAoCliente);
                
                Decimal ldcVlTotal = 0;
                ContaBancaria loContaBancariaCliente = null;

                foreach (LancamentoFinanceiroPK loLancamentoFinanceiroPK in aoListaLancamentoFinanceiro)
                {
                    ILancamentoFinanceiroDAL loLancamentoFinanceiroDAO = ConcreteDALFactory.CreateLancamentoFinanceiroDAL();
                    LancamentoFinanceiro loLancamentoFinanceiro = loLancamentoFinanceiroDAO.Load(loLancamentoFinanceiroPK);
                    loLancamentoFinanceiro.LncChRepassado = true;
                    loLancamentoFinanceiro.RepasseAoCliente = loRepasseAoCliente;
                    ldcVlTotal += loLancamentoFinanceiro.LncVlLancamento;
                    loSession.Update(loLancamentoFinanceiro);

                    HibernateSessionManager.Instance.InitializeObject(loLancamentoFinanceiro.TituloFinanceiro.Cliente.ContaBancaria);
                    IEnumerator loEnumerator = loLancamentoFinanceiro.TituloFinanceiro.Cliente.ContaBancaria.GetEnumerator();
                    loEnumerator.MoveNext();
                    loContaBancariaCliente = (ContaBancaria)loEnumerator.Current; 
                }

                LancamentoFinanceiro loLancamentoFinanceiroCreditoRepasse = new LancamentoFinanceiro();
                loLancamentoFinanceiroCreditoRepasse.MovimentacaoFinanceira = loMovimentacaoFinanceira;
                loLancamentoFinanceiroCreditoRepasse.ContaBancaria = loContaBancariaCliente;
                loLancamentoFinanceiroCreditoRepasse.LncChRepassado = false;
                loLancamentoFinanceiroCreditoRepasse.LncDtRegistro = DateTime.Today;
                loLancamentoFinanceiroCreditoRepasse.LncDtLancamento = DateTime.Today;
                loLancamentoFinanceiroCreditoRepasse.LncTpCreditoDebito = "C";
                loLancamentoFinanceiroCreditoRepasse.LncTpLancamento = "T";
                loLancamentoFinanceiroCreditoRepasse.LncVlLancamento = ldcVlTotal;

                LancamentoFinanceiro loLancamentoFinanceiroDebitoRepasse = new LancamentoFinanceiro();
                loLancamentoFinanceiroDebitoRepasse.MovimentacaoFinanceira = loMovimentacaoFinanceira;
                loLancamentoFinanceiroDebitoRepasse.ContaBancaria = loContaBancariaEmpresa;
                loLancamentoFinanceiroDebitoRepasse.LncChRepassado = false;
                loLancamentoFinanceiroDebitoRepasse.LncDtRegistro = DateTime.Today;
                loLancamentoFinanceiroDebitoRepasse.LncDtLancamento = DateTime.Today;
                loLancamentoFinanceiroDebitoRepasse.LncTpCreditoDebito = "D";
                loLancamentoFinanceiroDebitoRepasse.LncTpLancamento = "T";
                loLancamentoFinanceiroDebitoRepasse.LncVlLancamento = ldcVlTotal;

                loSession.Save(loLancamentoFinanceiroCreditoRepasse);
                loSession.Save(loLancamentoFinanceiroDebitoRepasse);
                //loSession.Transaction.Commit();
            }
            catch (Exception loException)
            {
                loSession.Close();
                throw;
            }

            return loMovimentacaoFinanceira;

        }


        public  Usuario PreparaEmissaoBoleto(string idTitulo)
        {


            /*
            // ---------------------------------
            // Cadastro do Usuario
            // ---------------------------------
            Usuario loUsuario = new Usuario();

            
            loUsuario.UsuarioPK = new UsuarioPK();
            // loUsuario.Cliente.Add(aoCliente);
            loUsuario.UsrDsNickname = asNickname;
            loUsuario.UsrDsSenha = asSenha;
            loUsuario.UsrDsNome = asNome;
            loUsuario.UsrDsSobrenome = asSobrenome;
            loUsuario.UsrDsEmail = asEmail;
            loUsuario.UsrTpUsuario = aoTipoUsuario.GetHashCode().ToString();


            IUsuarioDAL loUsuarioDAO = ConcreteDALFactory.CreateUsuarioDAL();

            BUsuario loBUsuario = new BUsuario(loUsuario);
            loBUsuario.ValidaSenha();

            loUsuarioDAO.Insert(loUsuario);
            */
            return null;


        }
        public string EmitirBoleto(TituloFinanceiro aoTituloFinanceiro)
        {
            ContaBancaria loContaBancaria = this.RecuperaContaBancariaEmpresa();
            Convenio loConvenio = null;

            if (loContaBancaria.Convenio.Count > 0)
            {
                IEnumerator loListaConvenio = loContaBancaria.Convenio.GetEnumerator();
                loListaConvenio.MoveNext();
                loConvenio = (Convenio)loListaConvenio.Current;
            }

            
            //Cria instância do objeto CobreBemX
            CobreBemX.ContaCorrente _CobreBemX = new CobreBemX.ContaCorrente();

            //Monta arquivo de licença de teste para banco 001 carteira 18
            _CobreBemX.ArquivoLicenca = @"c:\001-16.conf";

            //Monta dados da conta corrente
            _CobreBemX.CodigoAgencia = loContaBancaria.Agencia.AgcNuAgencia;
            _CobreBemX.NumeroContaCorrente = loContaBancaria.CnbNuConta;
            _CobreBemX.CodigoCedente = loConvenio.CvnCdCedente;
            _CobreBemX.OutroDadoConfiguracao1 = "109";
            _CobreBemX.InicioNossoNumero = "00001";
            _CobreBemX.FimNossoNumero = "99999";
            _CobreBemX.ProximoNossoNumero = "00015";

            _CobreBemX.PadroesBoleto.PadroesBoletoEmail.URLLogotipo = @"http://localhost:1750/ImagensCBX/logocbt.jpg";

            _CobreBemX.PadroesBoleto.PadroesBoletoEmail.URLImagensCodigoBarras = @"http://localhost:1750/ImagensCBX/";
            
            //Cria documento de cobrança
            CobreBemX.IDocumentoCobranca Boleto = _CobreBemX.DocumentosCobranca.Add;

            // --------------------------------------------------------------
            // Dados do sacado
            // --------------------------------------------------------------
            Sacado loSacado = aoTituloFinanceiro.Sacado;
            Pessoa loPessoaSacado = loSacado.Pessoa;

            Boleto.NomeSacado = loPessoaSacado.PesNmPessoa;
            Boleto.CPFSacado = loPessoaSacado.PesNuCpfCnpj;


            Endereco loEnderecoSacado = null;
            if (loPessoaSacado.Endereco.Count > 0)
            {
                IEnumerator loListaEndereco = loPessoaSacado.Endereco.GetEnumerator();
                loListaEndereco.MoveNext();
                loEnderecoSacado = (Endereco)loListaEndereco.Current;
            }

            Boleto.EnderecoSacado = loEnderecoSacado.EndNmLogradouro + ","  + loEnderecoSacado.EndDsComplemento;
            Boleto.BairroSacado = loEnderecoSacado.EndNmBairro;
            Boleto.CidadeSacado = loEnderecoSacado.Cidade.CidNmCidade;
            Boleto.EstadoSacado = loEnderecoSacado.Estado.EstSgEstado;
            Boleto.CepSacado = loEnderecoSacado.EndNuCep;

            //Monta dados do documento de cobrança
            Boleto.DataDocumento = DateTime.Now.ToShortDateString();

            //Data de Vencimento 3 dias após a data do servidor
            Boleto.DataVencimento = aoTituloFinanceiro.TtfDtVencimento.ToShortDateString();

            Boleto.NumeroDocumento = aoTituloFinanceiro.TtfNuTitulo.ToString();
            Boleto.ValorDocumento = Convert.ToDouble(aoTituloFinanceiro.TtfVlTitulo);

            Boleto.PadroesBoleto.Demonstrativo = "Referente a compras na WEB<br><b>O melhor site da Internet</b>";
            Boleto.PadroesBoleto.InstrucoesCaixa = "<br><br>Não cobrar juros e multa após o vencimento";

            //Solicita a geração do boleto e retorna-o como o resultado
            //Response.Write(_CobreBemX.get_GeraHTMLBoleto(0));
            string lsConteudoHTMLBoleto = _CobreBemX.get_GeraHTMLBoleto(0);

            //Libera instãncia do objeto CobreBemX
            _CobreBemX = null;

            return lsConteudoHTMLBoleto;
        }


        

    }

   

}